package blog

import (
	"context"
	"strings"

	"gitee.com/lishixi/gops/vblog/apps/utils"
	"github.com/infraboard/mcube/v2/ioc"
)

const AppName = "blog"

func GetService() Service {
	return ioc.Controller().Get(AppName).(Service)
}

type Service interface {
	//创建博客
	CreateBlog(context.Context, *CreateBlogRequest) (*Blog, error)
	//列表查询
	QueryBlog(context.Context, *QueryBlogRequest) (*BlogSet, error)
	//详情查询
	DescribeBlog(context.Context, *DescribeBlogRequest) (*Blog, error)
	//编辑
	UpdateBlog(context.Context, *UpdateBlogRequest) (*Blog, error)
	//发布
	PublishBlog(context.Context, *PublishBlogRequest) (*Blog, error)
	//删除
	DeleteBlog(context.Context, *DeleteBlogRequest) error
}

type DeleteBlogRequest struct {
	utils.GetRequest
}
type PublishBlogRequest struct {
	utils.GetRequest
	StatusSpec
}

type UpdateBlogRequest struct {
	utils.GetRequest
	CreateBlogRequest
}

type DescribeBlogRequest struct {
	utils.GetRequest
}

func NewQueryBlogRequest() *QueryBlogRequest {
	return &QueryBlogRequest{
		PageRequest: *utils.NewPageRequest(),
		Tags:        map[string]string{},
	}
}

type QueryBlogRequest struct {
	// 分页参数
	utils.PageRequest
	// 文章标题模糊查询
	KeyWords string `json:"keywords" form:"keywords"`
	// 状态过滤参数，作者：nil 不需要过滤，访客：1 过滤已发布
	Stage *STAGE `json:"stage" form:"stage"`
	// 查询某个用户具体的文章，给作者用
	CreateBy string `json:"create_by" form:"create_by"`
	// 查询某个分类的文章
	Category string `json:"category" form:"category"`
	// 查询某个标签的文章
	Tags map[string]string `json:"tags"`
}

// key1=val=ue1&key2=value2
func (r *QueryBlogRequest) SetTag(tag string) {
	kvItem := strings.Split(tag, "&")
	// key1=val=ue1
	for i := range kvItem {
		kvString := kvItem[i]
		kv := strings.Split(kvString, "=")
		// key1 val ue1
		if len(kv) > 1 {
			// key1 val=ue1
			r.Tags[kv[0]] = strings.Join(kv[1:], "=")
		}
	}
}
